Skip to content

Make State a class and add Graph::mutated() - #589

Open
wbernoudy wants to merge 2 commits into
dwavesystems:mainfrom
wbernoudy:feature/graph-mutated-nodes
Open

Make State a class and add Graph::mutated()#589
wbernoudy wants to merge 2 commits into
dwavesystems:mainfrom
wbernoudy:feature/graph-mutated-nodes

Conversation

@wbernoudy

Copy link
Copy Markdown
Member

What does this implement/fix?

This PR adds the Graph::mutated() method which returns the list of decision nodes with "pending" changes (see docstring for more details). It also makes State a class rather than an alias to a vector of data pointers in order to help implement Graph::mutated().

Additional information

For now, I left the implementation of Graph::mutated() simple, and it will return only decision nodes, and not specific successors of DisjointListsNode and DisjointBitSetsNode. However, if we plan to use this directly with descendants()/propagate() etc., we may need to consider returning specific successors because of the known performance hit on models with large amounts of lists/sets on individual DisjointListsNode/DisjointBitSetsNodes.

AI Generation Disclosure

No AI tools used

@wbernoudy
wbernoudy marked this pull request as ready for review July 31, 2026 19:22
struct Decision {};

class Graph {
friend class State;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we need this?

return node_data_[index];
}

void resize(ssize_t size) { node_data_.resize(size); }

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since we're granting friendship to Graph, do we want to make this private?

}

std::span<const DecisionNode*> Graph::mutated(State& state) const {
// We will want to eventually replace this implementation with an approach where

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IMO we want to do this as part of this PR. Probably means keeping a boolean array of flags as well to determine which decisions have already been added?

friend class Graph;

public:
State(ssize_t size = 0) : node_data_(size) {}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we want to make the constructors private since we're granting friendship to Graph? We might want to leave the default (empty) constructor public for Cython reasons.


void resize(ssize_t size) { node_data_.resize(size); }

ssize_t size() const { return node_data_.size(); }

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Need to include dwave-optimization/common.hpp for ssize_t, this will fix the current windows failures.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants